home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CDC
/
CDCSXSRC.LZH
/
SW_SUB.HAS
< prev
next >
Wrap
Text File
|
1995-03-20
|
4KB
|
225 lines
*
*
*スイッチ処理ルーチン
*
*
* -A<short> -Z<short>
.include DOSCALL.MAC *標準の奴(XC)
.include SXCALL.MAC
.include SXCALL.H
.include YOU200.MAC *独自のマクロ定義ファイルです
.include HASMACRO.MAC *HAS2.5以降のマクロパッケージ
.include WORK.INC *ワークエリアの内容を定義するファイル
.include FLAG.INC *条件付アセンブル処理を定義するファイル
*==============================================*
.iff OPTION_SW=0
.xref PrintMyErr
reglist reg d1-d7/a1-a4
ofs = -8
.offset ofs
Numptr: ds.l 1
Numptr2: ds.l 1
ds.l 2
SWmode: ds.w 1 *関数のモード0=CHECK,1=SAVE,2=EXCHG
SWptr: ds.l 1 *argtbl(l),null,swstr(short)+swnum(short)
.text
*==============================================*
SWITCHproc::
link a6,#ofs
ifeq <cmp.w #SW_SAVE,SWmode(a6)>
jbsr SW_saving
elseifeq <cmp.w #SW_CHK,SWmode(a6)>
jbsr SW_setting
elseifeq <cmp.w #SW_EXCHG,SWmode(a6)> *スイッチの変更
jbsr SW_exchange
endif
unlk a6
rts
SW_setting:
movem.l reglist,-(sp)
move.l SWptr(a6),a1
* lea.l SW_WORK(a5),a0
* move.l a0,Numptr(a6) *a0=パラメータ数値格納ワークのadr
ifne <move.l (a1)+,d1> *最初の4バイトはパラメータの数
jbsr ChkSw0 *パラメータ処理ルーチンへ
else
~T *パラメータなしなら正常終了しちゃう
endif
movem.l (sp)+,reglist
rts
ChkSw0:
repeat
movea.l (a1)+,a2 *a2=文字列のadr.
ifeq <cmpi.b #'-',(a2)>
jbsr ChkSw1
breakmi <tst.l d0>
elseifeq <cmpi.b #'/',(a2)>
jbsr ChkSw1
breakmi <tst.l d0>
else
jbsr ChkSw_filename *ファイル名指定とみなしてチェック(未)
breakmi <tst.l d0>
endif
untileq <subq.l #1,d1>
rts
ChkSw1:
lea.l SWSTR(pc),a3 *スイッチテーブルadr.
lea.l SW_Flag(a5),a4 *スイッチのON/OFFのフラグのwork
moveq #1,d4
lea.l SW_WORK(a5),a0
move.l a0,Numptr(a6) *先頭に戻す
repeat
move.b (a3),d3 *スイッチ文字列
move.b d3,d5
add.b #$20,d3 *小文字にしたもの
ifeq <cmp.b 1(a2),d5> *大文字でチェック
move.b #$ff,(a4) *ONに
ifne <tst.b 2(a2)>
jbsr ChkNum *数値付きかチェック
ifmi <tst.l d0>
~T
break
endif
endif
~F
break *マッチしたら抜ける
elseifeq <cmp.b 1(a2),d3> *小文字でチェック
move.b #$ff,(a4) *ON
ifne <tst.b 2(a2)>
jbsr ChkNum
ifmi <tst.l d0>
~T
break
endif
endif
~F
break
endif
add.l #1,a3 *マッチング用の文字列を進める
add.l #1,a4
add.l #2,Numptr(a6) *数値用のグローバルワークを進める
~T
lsl.l #1,d4
untileq <tst.b (a3)> *最後までマッチしないこともある
and.l #USABLE_SW,d4
ifeq <tst.l d4> *d4=使用可能スイッチにマッチしているか
lea.l sw_e_mes1(pc),a0
jbsr PrintMyErr
~F
elseifeq <tst.l d0> *不正なスイッチ文字、数字の場合
lea.l sw_e_mes2(pc),a0
jbsr PrintMyErr
~F
else
~T
endif
rts
ChkNum:
pea.l 2(a2) *文字列を数値に
SX $A3DF,4 *SXCALL SXSTOL
ifmi <tst.l d0>
~F
else
move.l Numptr(a6),a0
move.w d0,(a0) *スイッチに付随する数値をワークにセット
~T
endif
rts
ChkSw_filename:
*未記述:ファイルネームには未対応
~T
rts
SWSTR:
dc.b 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',0
.even
sw_e_mes1:
dc.b '無効なスイッチです。おしまい',0
.even
sw_e_mes2:
dc.b '無効なスイッチです。だめだこりゃ',0
.even
.endif
*======================================================*
*オプション文字列をセーブする
*-Wオプションは考慮しない。
*======================================================*
.offset -512
tdb_wk ds.b 90
tdb_cmdL: ds.b 1
tdb_cmdline: ds.b 1
.text
SW_saving:
link a6,#-512
movem.l a1-a2,-(sp)
lea.l SW_Flag(a5),a1
move.w #-1,-(sp)
pea.l -512(a6)
SX __TSGetTdb,6
lea.l tdb_cmdL(a6),a1 *文字先頭アドレス
lea.l SW_Flag(a5),a2
ifne <tst.b SW_I(a2)>
move.b #3,(a1)+
move.b #' ',(a1)+
move.b #'-',(a1)+
move.b #'I',(a1)
endif
move.w #-1,-(sp)
pea.l -512(a6)
SX __TSSetTdb,6
movem.l (sp)+,a1-a2
unlk a6
rts
*======================================================*
*使用中のスイッチの変更(トグル)
*======================================================*
SW_exchange:
lea SW_Flag(a5),a0
adda.w SWptr(a6),a0
not.b (a0)
lea.l SW_WORK(a5),a0 *スイッチに付いている数字のワーク
move.w SWptr(a6),d0
add.w d0,d0 *2TIMES
adda.w d0,a0
move.w SWptr+2(a6),(a0)
rts
.end